package com.duoduo.限流算法;

/**
 * @program: algorithm
 * @description: 漏桶限流算法
 * @author: chaidl  ！
 * @create: 2022-05-29 16:48
 */
public class LeakyBucket {
	public long timeStamp = System.currentTimeMillis();  // 当前时间
	public long capacity; // 桶的容量
	public long rate; // 水漏出的速度(每秒系统能处理的请求数)
	public long water; // 当前水量(当前累积请求数)
	
	public boolean limit() {
		//拿到当前时间
		long now = System.currentTimeMillis();
		water = Math.max(0, water - ((now - timeStamp)/1000) * rate); // 先执行漏水，计算剩余水量
		timeStamp = now;
		if ((water + 1) < capacity) {
			// 尝试加水,并且水还未满
			water += 1;
			return true;
		} else {
			// 水满，拒绝加水
			return false;
		}
	}
}
